#include "gd32h7xx.h"
#include "systick.h"
#include "tx_api.h"

#define DEMO_STACK_SIZE         1024
#define MEMORY_AREA_SIZE_BYTE_POOL_0     9120

TX_THREAD               thread_0;
TX_THREAD               thread_1;
TX_THREAD               thread_2;

TX_BYTE_POOL            byte_pool_0;

UCHAR                   memory_area_byte_pool_0[MEMORY_AREA_SIZE_BYTE_POOL_0];


void    thread_0_entry(ULONG thread_input);
void    thread_1_entry(ULONG thread_input);
void    thread_2_entry(ULONG thread_input);

/*!
    \brief      enable the CPU Chache
    \param[in]  none
    \param[out] none
    \retval     none
*/
static void cache_enable(void)
{
    /* Enable I-Cache */
    SCB_EnableICache();

    /* Enable D-Cache */
    SCB_EnableDCache();
}

/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    /* enable the CPU Cache */
    cache_enable();
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
    /* enable the LED GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOC);
    /* configure LED GPIO pin */ 
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_60MHZ, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);

    /* reset LED GPIO pin */
    gpio_bit_reset(GPIOC, GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12);
    
    tx_kernel_enter();

    while(1){}
}

void tx_application_define(void *first_unused_memory)
{
    char    *pointer = TX_NULL;
    /* 创建一个字节池，并指定字节池的属性  */
    tx_byte_pool_create(&byte_pool_0, "byte pool 0", memory_area_byte_pool_0, MEMORY_AREA_SIZE_BYTE_POOL_0);

/*
UINT tx_thread_create(  TX_THREAD *thread_ptr,//指向线程控制块的指针。这是由用户分配的内存，用于存储线程的控制块
                        CHAR *name_ptr,// 指向线程名称的指针。这是一个可选参数，用于标识线程
                        VOID (*entry_function)(ULONG),//线程的入口函数。这是线程执行的主要任务
                        ULONG entry_input,//传递给入口函数的输入参数。这是一个可选参数，用于传递线程的初始化数据
                        VOID *stack_start,//线程堆栈的起始地址。这是线程的堆栈空间，用于存储线程的局部变量和函数调用
                        ULONG stack_size,//线程堆栈的大小。这是线程的堆栈空间的大小
                        UINT priority,// 线程的优先级。这是线程的执行优先级，用于确定线程在系统中的调度顺序
                        UINT preempt_threshold,//线程的抢占优先级阈值。这是线程的最高抢占优先级，用于确定线程是否可以被其他线程抢占
                        ULONG time_slice,//线程的时间片。这是线程在系统中的调度时间间隔，用于确定线程的执行周期
                        UINT auto_start//线程的自动启动标志。如果设置为TX_AUTO_START，则线程会在创建后自动启动；否则，需要手动启动线程
                    );
*/
    
    tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
    tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,  
            pointer, DEMO_STACK_SIZE, 
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);

    tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
    tx_thread_create(&thread_1, "thread 1", thread_1_entry, 0,  
            pointer, DEMO_STACK_SIZE, 
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
    tx_byte_allocate(&byte_pool_0, (VOID **) &pointer, DEMO_STACK_SIZE, TX_NO_WAIT);
    tx_thread_create(&thread_2, "thread 2", thread_2_entry, 0,  
            pointer, DEMO_STACK_SIZE, 
            1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
}


void    thread_0_entry(ULONG thread_input)
{

    while(1)
    {
        gpio_bit_set(GPIOC, GPIO_PIN_9);
        tx_thread_sleep(500);
        gpio_bit_reset(GPIOC, GPIO_PIN_9);
        tx_thread_sleep(500);
    }
}

void    thread_1_entry(ULONG thread_input)
{

    while(1)
    {
        gpio_bit_set(GPIOC, GPIO_PIN_10);
        tx_thread_sleep(400);
        gpio_bit_reset(GPIOC, GPIO_PIN_10);
        tx_thread_sleep(400);
    }
}

void    thread_2_entry(ULONG thread_input)
{

    while(1)
    {
        gpio_bit_set(GPIOC, GPIO_PIN_11);
        tx_thread_sleep(300);
        gpio_bit_reset(GPIOC, GPIO_PIN_11);
        tx_thread_sleep(300);
    }
}


